package org.mybatis.study.mapper;

import org.apache.ibatis.annotations.Param;
import org.mybatis.study.model.SysRole;
import org.mybatis.study.model.SysUser;

import java.util.List;
import java.util.Map;

/**
 * @author fangyu
 * @version v1.0.0
 * @date 2020/9/20 11:27 下午
 */
public interface UserMapper {
    /**
     * 通过id查询用户
     * @param id id
     * @return SysUser
     */
    SysUser selectById(Long id);

    /**
     * 查询所有用户
     * @return List<SysUser>
     */
    List<SysUser> selectAll();

    /**
     * 通过用户id查询角色信息
     * @param userId 用户id
     * @return List<SysRole>
     */
    List<SysRole> selectRoleByUserId(Long userId);

    /**
     * 新增用户
     *
     * @param sysUser 用户
     * @return int
     */
    int insert(SysUser sysUser);

    /**
     * 新增用户-使用userGeneratedKeys方式
     * @param sysUser 用户
     * @return int
     */
    int insert2(SysUser sysUser);

    /**
     * 新增用户-使用selectKey方式
     * @param sysUser 用户
     * @return int
     */
    int insert3(SysUser sysUser);

    /**
     * 根据主键更新
     * @param sysUser 用户
     * @return int
     */
    int updateById(SysUser sysUser);

    /**
     * 通过主键删除
     * @param id 主键
     * @return int
     */
    int deleteById(Long id);

    /**
     * 通过主键删除
     *
     * @param sysUser 用户
     * @return int
     */
    int deleteById(SysUser sysUser);

    /**
     * 根据用户 id 和 角色的 enabled 状态获取用户的角色
     *
     * @param userId 用户id
     * @param enabled 是否可用
     * @return List<SysRole>
     */
    List<SysRole> selectRolesByUserIdAndRoleEnabled(@Param("userId")Long userId, @Param("enabled")Integer enabled);

    /**
     * 根据用户 id 和 角色的 enabled 状态获取用户的角色
     *
     * @param user 用户信息
     * @param role 角色信息
     * @return List<SysRole>
     */
    List<SysRole> selectRolesByUserAndRole(@Param("user")SysUser user, @Param("role")SysRole role);

    /**
     * MyBatis 动态SQL - 根据动态条件查询用户信息
     *
     * @param sysUser 用户
     * @return List<SysUser>
     */
    List<SysUser> selectByUser(SysUser sysUser);

    /**
     * MyBatis 动态SQL - 根据主键动态更新
     *
     * @param sysUser 用户
     * @return int
     */
    int updateByIdSelective(SysUser sysUser);

    /**
     * MyBatis 动态SQL - 动态新增用户
     * @param sysUser 用户
     * @return int
     */
    int insert4(SysUser sysUser);

    /**
     * MyBatis 动态SQL - 根据用户 id 或用户名查询
     *
     * @param sysUser 用户
     * @return SysUser
     */
    SysUser selectByIdOrUserName(SysUser sysUser);

    /**
     * MyBatis 动态SQL - 根据用户 id 集合查询
     *
     * @param idList id集合
     * @return List<SysUser>
     */
    List<SysUser> selectByIdList(List<Long> idList);

    /**
     * MyBatis 动态SQL - foreach 实现批量插入
     *
     * @param userList 用户list
     * @return int
     */
    int insertList(List<SysUser> userList);

    /**
     * MyBatis 动态SQL - foreach 实现动态更新 -> 通过 Map 批量更新列
     *
     * @param map Map
     * @return int
     */
    int updateByMap(Map<String, Object> map);

    /**
     * MyBatis 高级查询 - 根据用户 id 获取用户信息和用户的角色信息 - 使用自动映射处理一对一关系
     *
     * @param id 用户id
     * @return SysUser
     */
    SysUser selectUserAndRoleById(Long id);

    /**
     * MyBatis 高级查询 - 根据用户 id 获取用户信息和用户的角色信息 - 使用resultMap 配置一对一映射
     *
     * @param id 用户id
     * @return SysUser
     */
    SysUser selectUserAndRoleById2(Long id);

    /**
     * MyBatis 高级查询 - 根据用户 id 获取用户信息和用户的角色信息(嵌套查询方式) - association标签的嵌套查询
     *
     * @param id 用户id
     * @return SysUser
     */
    SysUser selectUserAndRoleByIdSelect(Long id);

    /**
     * MyBatis 高级查询 => 一对多查询 -> collection 集合的嵌套结果映射
     * 获取所有的用户以及对应的所有角色
     *
     * @return List<SysUser>
     */
    List<SysUser> selectAllUserAndRoles();

    /**
     * MyBatis 高级查询 => 一对多查询 -> collection 集合的嵌套结果映射
     * 获取所有的用户以及对应的所有角色以及相应的权限列表
     *
     * @return List<SysUser>
     */
    List<SysUser> selectAllUserAndRolesAndPrivilege();

    /**
     * MyBatis 高级查询 => 一对多查询 -> collection 集合的嵌套查询
     * 通过嵌套查询获取指定用户的信息以及用户的角色和权限信息
     *
     * @param id 用户id
     * @return SysUser
     */
    SysUser selectAllUserAndRolesSelect(Long id);
}
